--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
libs/able/able/filters.py HEAD (8b8a5035) Text, 7.84 KB
T8b949e"""BLE scanning filters,
wrappers for Java class `android.bluetooth.le.ScanFilter.Builder`
https://developer.android.com/reference/android/bluetooth/le/ScanFilter.Builder
"""
Tff7b72from T7ee787abc Tff7b72import Te6edf3abstractmethod
Tff7b72from T7ee787dataclasses Tff7b72import Te6edf3dataclassTb4b4b4, Te6edf3field
Tff7b72from T7ee787typing Tff7b72import Te6edf3ListTb4b4b4, Te6edf3Union
Tff7b72import T7ee787uuid
Tff7b72from T7ee787jnius Tff7b72import Te6edf3autoclass
Te6edf3ParcelUuid Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.os.ParcelUuidTa5d6ff'Tb4b4b4)
Te6edf3BluetoothAdapter Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.bluetooth.BluetoothAdapterTa5d6ff'Tb4b4b4)
Te6edf3ScanFilter Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.bluetooth.le.ScanFilterTa5d6ff'Tb4b4b4)
Te6edf3ScanFilterBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.bluetooth.le.ScanFilter$BuilderTa5d6ff'Tb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364FilterTb4b4b4:
T8b949e"""Base class for BLE scanning fiters.
>>> # Filters of different kinds could be ANDed to set multiple conditions.
>>> # Both device name and address required:
>>> combined_filter = DeviceNameFilter("Example") & DeviceAddressFilter("01:02:03:AB:CD:EF")
>>> DeviceNameFilter("Example1") & DeviceNameFilter("Example2")
Traceback (most recent call last):
ValueError: cannot combine filters of the same type
"""
Tff7b72def Td2a8ff__post_init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffilters Tff7b72= Tb4b4b4[Tff7b72selfTb4b4b4]
Tff7b72def Tff7b72__and__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72in Tb4b4b4(Tffa657typeTb4b4b4(Te6edf3fTb4b4b4) Tff7b72for Te6edf3f Tff7b72in Te6edf3otherTff7b72.Td2a8fffiltersTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffcannot combine filters of the same typeTa5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffiltersTff7b72.Td2a8ffextendTb4b4b4(Te6edf3otherTff7b72.Td2a8fffiltersTb4b4b4)
Tff7b72return Tff7b72self
Tff7b72def Td2a8ffbuildTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3builder Tff7b72= Te6edf3ScanFilterBuilderTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3scan_filter Tff7b72in Tff7b72selfTff7b72.Td2a8fffiltersTb4b4b4:
Te6edf3scan_filterTff7b72.Td2a8fffilterTb4b4b4(Te6edf3builderTb4b4b4)
Tff7b72return Te6edf3builderTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Tf0883e@abstractmethod
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72class T56d364EmptyFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Filter with no restrictions."""
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Tff7b72pass
Tf0883e@dataclass
Tff7b72class T56d364DeviceAddressFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on device address.
Uses Java method `ScanFilter.Builder.setDeviceAddress`.
:param address: Address in the format of "01:02:03:AB:CD:EF"
>>> DeviceAddressFilter("01:02:03:AB:CD:EF")
DeviceAddressFilter(address='01:02:03:AB:CD:EF')
"""
Te6edf3addressTb4b4b4: Tffa657str
Tff7b72def Td2a8ff__post_init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__post_init__Tb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3BluetoothAdapterTff7b72.Td2a8ffcheckBluetoothAddressTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaddressTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffaddressTffd700}Ta5d6ff is not a valid Bluetooth addressTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetDeviceAddressTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaddressTb4b4b4)Tb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364DeviceNameFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on device name.
Uses Java method `ScanFilter.Builder.setDeviceName`.
:param name: Device name
"""
Te6edf3nameTb4b4b4: Tffa657str
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetDeviceNameTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4)Tb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ManufacturerDataFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on manufacture data.
Uses Java method `ScanFilter.Builder.setManufacturerData`.
:param id: Manufacturer ID
:param data: Manufacturer specific data
:param mask: bit mask for partial filtration of the `data`. For any bit in the mask,
set it to 1 if it needs to match the one in manufacturer data,
otherwise set it to 0 to ignore that bit.
>>> # Filter by just ID, ignoring the data:
>>> ManufacturerDataFilter(0x0AD0, [])
ManufacturerDataFilter(id=2768, data=[], mask=None)
>>> ManufacturerDataFilter(0x0AD0, [0x2, 0x15, 0x8d])
ManufacturerDataFilter(id=2768, data=[2, 21, 141], mask=None)
>>> # With mask set to ignore the second data byte:
>>> ManufacturerDataFilter(0x0AD0, [0x2, 0, 0x8d], [0xff, 0, 0xff])
ManufacturerDataFilter(id=2768, data=[2, 0, 141], mask=[255, 0, 255])
>>> ManufacturerDataFilter(0x0AD0, [0x2, 21, 0x8d], [0xff])
Traceback (most recent call last):
ValueError: mask is shorter than the data
"""
Tffa657idTb4b4b4: Tffa657int
Te6edf3dataTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657listTb4b4b4, Tffa657tupleTb4b4b4, Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4]
Te6edf3maskTb4b4b4: Te6edf3ListTb4b4b4[Tffa657intTb4b4b4] Tff7b72= Te6edf3fieldTb4b4b4(Te6edf3default_factoryTff7b72=Tff7b72lambdaTb4b4b4: Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ff__post_init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__post_init__Tb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmask Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4) Tff7b72< Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffmask is shorter than the dataTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetManufacturerDataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetManufacturerDataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ServiceDataFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on service data.
Uses Java method `ScanFilter.Builder.setServiceData`.
:param uid: UUID of the service in the format of
"0000180f-0000-1000-8000-00805f9b34fb"
:param data: service data
:param mask: bit mask for partial filtration of the `data`. For any bit in the mask,
set it to 1 if it needs to match the one in service data,
otherwise set it to 0 to ignore that bit.
>>> ServiceDataFilter("0000180f-0000-1000-8000-00805f9b34fb", [])
ServiceDataFilter(uid='0000180f-0000-1000-8000-00805f9b34fb', data=[], mask=None)
>>> # With mask set to ignore the first data byte:
>>> ServiceDataFilter("0000180f-0000-1000-8000-00805f9b34fb", [0, 0x11], [0, 0xff])
ServiceDataFilter(uid='0000180f-0000-1000-8000-00805f9b34fb', data=[0, 17], mask=[0, 255])
>>> ServiceDataFilter("0000180f", [])
Traceback (most recent call last):
ValueError: badly formed hexadecimal UUID string
>>> ServiceDataFilter("0000180f-0000-1000-8000-00805f9b34fb", [0x12, 0x34], [0xff])
Traceback (most recent call last):
ValueError: mask is shorter than the data
"""
Te6edf3uidTb4b4b4: Tffa657str
Te6edf3dataTb4b4b4: Te6edf3UnionTb4b4b4[Tffa657listTb4b4b4, Tffa657tupleTb4b4b4, Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4]
Te6edf3maskTb4b4b4: Te6edf3ListTb4b4b4[Tffa657intTb4b4b4] Tff7b72= Te6edf3fieldTb4b4b4(Te6edf3default_factoryTff7b72=Tff7b72lambdaTb4b4b4: Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ff__post_init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__post_init__Tb4b4b4(Tb4b4b4)
T8b949e# validate UUID value
Te6edf3uuidTff7b72.Td2a8ffUUIDTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmask Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4) Tff7b72< Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffmask is shorter than the dataTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Te6edf3uid Tff7b72= Te6edf3ParcelUuidTff7b72.Td2a8fffromStringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetServiceDataTb4b4b4(Te6edf3uidTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetServiceDataTb4b4b4(Te6edf3uidTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ServiceSolicitationFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on service solicitation uuid.
Uses Java method `ScanFilter.Builder.setServiceSolicitation`.
:param uid: UUID of the service in the format of
"0000180f-0000-1000-8000-00805f9b34fb"
"""
Te6edf3uidTb4b4b4: Tffa657str
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Te6edf3uid Tff7b72= Te6edf3ParcelUuidTff7b72.Td2a8fffromStringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidTb4b4b4)
Te6edf3builderTff7b72.Td2a8ffsetServiceSolicitationTb4b4b4(Te6edf3uidTb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ServiceUUIDFilterTb4b4b4(Te6edf3FilterTb4b4b4)Tb4b4b4:
T8b949e"""Set filter on service uuid.
Uses Java method `ScanFilter.Builder.setServiceUuid`.
:param uid: UUID of the service in the format of
"0000180f-0000-1000-8000-00805f9b34fb"
:mask: bit mask for partial filtration of the UUID, in the format of
"ffffffff-0000-0000-0000-ffffffffffff". Set any bit in the mask
to 1 to indicate a match is needed for the bit in `uid`,
and 0 to ignore that bit.
>>> ServiceUUIDFilter('16fe0d00-c111-11e3-b8c8-0002a5d5c51b')
ServiceUUIDFilter(uid='16fe0d00-c111-11e3-b8c8-0002a5d5c51b', mask=None)
>>> ServiceUUIDFilter(
... '16fe0d00-c111-11e3-b8c8-0002a5d5c51b',
... 'ffffffff-0000-0000-0000-000000000000'
... ) #doctest: +ELLIPSIS
ServiceUUIDFilter(uid='16fe0d00-...', mask='ffffffff-...')
>>> ServiceUUIDFilter('123')
Traceback (most recent call last):
ValueError: badly formed hexadecimal UUID string
"""
Te6edf3uidTb4b4b4: Tffa657str
Te6edf3maskTb4b4b4: Tffa657str Tff7b72= Tff7b72None
Tff7b72def Td2a8ff__post_init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__post_init__Tb4b4b4(Tb4b4b4)
T8b949e# validate UUID values
Te6edf3uuidTff7b72.Td2a8ffUUIDTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4:
Te6edf3uuidTff7b72.Td2a8ffUUIDTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4)
Tff7b72def Td2a8fffilterTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3builderTb4b4b4)Tb4b4b4:
Te6edf3uid Tff7b72= Te6edf3ParcelUuidTff7b72.Td2a8fffromStringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuidTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4:
Te6edf3mask Tff7b72= Te6edf3ParcelUuidTff7b72.Td2a8fffromStringTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmaskTb4b4b4)
Te6edf3builderTff7b72.Td2a8ffsetServiceUuidTb4b4b4(Te6edf3uidTb4b4b4, Te6edf3maskTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3builderTff7b72.Td2a8ffsetServiceUuidTb4b4b4(Te6edf3uidTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────